#include <iostream>
using namespace std;
#include <signal.h>//信号接口调用头文件
#include <unistd.h>//sleep 头文件
#include <sys/wait.h>
// void handler(int signum)
// {
//     cout<<"signum is:"<<signum<<endl;//自定义方法只向屏幕打印信号数字，不做任何处理
//     sleep(1);
// }
// int main()
// {
//     typedef void(*sighandelr_t)(int);//定义类型
//     for(int i=0;i<31;i++)//把1~31号信号全捕捉
//     {
//     signal(i,handler);//捕捉到就会执行自定义方法
//     }

//     int a=10;
//     a/=0;//除零错误会发生异常
//     return 0;
// }
// typedef void(*sighandler_t)(int);
// void handler(int signum)
// {
//     cout<<"signum is:"<<signum<<endl;
//     int n=alarm(5);//设置一个5秒后提醒的闹钟
//     cout<<"闹钟剩余时间："<<n<<endl;
// }
// int main()
// {
// llabs

// int main()
// {
//     pid_t id=fork();
//     if(id<0)return -1;
//     else if(id==0)
//     {
//         int cnt=100;
//         while(cnt--)
//         {
//         cout<<"i am child process"<<"process id :"<<getpid()<<endl;
//         sleep(1);
//         }
//         exit(0);
//     }
//     //farther
//     int status=0;
//     pid_t n=waitpid(id,&status,0);
//     if(n==id)
//     {
//         cout<< "process exit code:"<<(status>>8&0xFF)
//         <<"!!  process exit signal:"<<(status&0x7F)       
//         <<"!! core dump:"<<((status>>7)&1)<<endl;  //0x7F=0111 1111(低7位是保存终止信号)
//         //&1 1 = 00000000 00000000 00000000 00000001
//     }
//     return 0;
// }

// int main()
// {
//     int a=10;
//     int b=0;
//     int c=a/b;
//     cout<<c<<endl;
//     return 0;
// }
void printPending(sigset_t & pending)
{
    for(int i=1;i<=31;i++)//1~31号信号，只要已经产生了就打印出来
    {
        if(sigismember(&pending,i))//判断信号i是否存在pending表中，存在代表这个信号已产生
        cout<<"1";
        else
        cout<<"0";
    }
    cout<<endl;
}
int main()
{
    //1. 屏蔽前的数据准备
    sigset_t bset,oldset;
    sigemptyset(&bset);//清空信号集
    sigemptyset(&oldset);
    for(int i=1;i<=31;i++)
    {
    sigaddset(&bset,i);//增加1~31号信号
    }
   //2.调用系统调用接口
    int n=sigprocmask(SIG_SETMASK,&bset,&oldset);//到这里已经屏蔽了1~31号信号
    if(n<0)return -1;

    //3.打印pending
    sigset_t pending;
    int cout =5;
    while(true)
    {
        int n=sigpending(&pending);//获取内核中pending表到 pending中；
        if(n<0)continue;//如果获取失败继续获取
        printPending(pending);//获取成功打印pending表
        sleep(1);
        if(--cout==0)
        {
    sigprocmask(SIG_SETMASK,&oldset,nullptr);//取消屏蔽
        }

    }


    return 0;
}